// 操作希望是 异步的
// const fs = require("fs") // 什么时候用同步, 什么时候用异步?
// 启动服务之前, 我们可以同步读取一些配置文件, 但是如果程序运行起来, 就不要同步读写了.

// 工具方法一般都是同步的(同步的性能更高), 异步的缺陷就是回调问题.

// copy 功能的实现 i/o 文件的读写. 读取的概念是把读到的内容放到内存中, 读取内存中的内容写入到文件中
const fs = require("fs")
const path = require("path")
// 读取文件不存在会报错, 写入的时候不存在会创建文件, 如果文件存在会清空文件

// fs.readFile(path.resolve(__dirname, "note.md"), "utf8", function (err, data) {
//   fs.writeFile(path.resolve(__dirname, "copy.md"), data, function (err) {
//     console.log("文件写入成功");
//   })
// })


// 不适合大文件读取, 如果是简单的文件可以使用上面这种方式, 对于大文件,我们操作使用 流
// 流的特点就是有方向,可以从一个地方到另一个地方
// 底层的文件操作, 需要对文件进行精确的读取.

/**
 *  流
 * 1. 读取之前打开文件 fs.open fs.read fs.write 开发的时候用不到. 通过这些api, 让大家掌握底层的实现
 * 开发的时候基本就会用 pipe
 */

// 流的特点 最终解决的问题: 就是防止淹没可用内存.
//
const buf = Buffer.alloc(3)
// r:读取  w:写入 a:追加  r+ 能读能写,以读取为准, 文件不存在报错
// 读 写 和执行 分成 三部分, 三个数来标识.  1 执行 4 读取 2 代表写入. 进制组合
fs.open(path.resolve(__dirname, "note.md"), "r", 0o666, function (err, fd) { // fd代表文件描述符, 是一个数组类型, 用完需要关闭掉
  console.log(fd); // fd 是一个数字, 用完需要关闭掉
  // buf 写入到buffer中, 从buffer的拿个位置开始写入3个字节, 从文件的第0个位置开始读取
  fs.read(fd, buf, 0, 3, 0, function (err, bytesRead) {
    console.log("bytesRead", bytesRead);
    fs.open(path.resolve(__dirname, "copy.txt"), 'w', function (err, wfd) {
      // 写入到文件中, 从buffer的di0个位置写入3个字节, 写入到文件的第0个位置
      fs.write(wfd, buf, 0, 3, 0, function (err, bytesWritten) {
        console.log(bytesWritten);
      })

    })
  }) // 把读到的写到内存 buf中
})
